package model;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Observable;
import java.util.Vector;

import controller.Engine;
@SuppressWarnings("unused")
public class Account extends Observable {
	private static int lastAccIdDb = 0;
	private int ID;
	private String photo = "add_photo.png";
	private String firstname = "";
	private String secondname = "";
	private int sex = 0;
	private Vector<Email> email = new Vector<Email>();
	private Vector<Indirizzo> indirizzo = new Vector<Indirizzo>();
	private Vector<Telefono> telefono = new Vector<Telefono>();
	private Vector<Account> rubrica = new Vector<Account>();
	private String username = "";
	private String password = "";
	private int level = 0;
	private Vector<Email> oldEmail = new Vector<Email>();
	private Vector<Indirizzo> oldIndirizzo = new Vector<Indirizzo>();
	private Vector<Telefono> oldTelefono = new Vector<Telefono>();
	private final String[] evnComuni = {
			// Eventi comuni
			"Altro", "Incontro", "Relazione", "Riunione", "Team building"

	};
	private String[] evnSector;

	public Account() {
		// per la creazione dell'account temporaneo con i valori di default
		setID(getLastAcc_IdOnDb() + 1);
		Account.lastAccIdDb = this.ID;
	}

	private int getLastAcc_IdOnDb() {
		ResultSet result = Database.getQueryResult("SELECT acc_id FROM account");
		int id = 0;
		try {
			result.last();
			id = result.getInt("acc_id");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Account.lastAccIdDb = id+1;
		return id+1;
	}

	// costruttore del contatto account
	public Account(int acc_id, String photo, String username, String password,
			String f_name, String s_name, int sex, int lvl, Vector<Email> eml,
			Vector<Indirizzo> adr, Vector<Telefono> tel, Vector<Account> agn) {
		setUsername(username);
		setPassword(password);
		setEmail(eml);
		setFirstname(f_name);
		setID(acc_id);
		setIndirizzo(adr);
		setPhoto(photo);
		setRubrica(agn);
		setSecondname(s_name);
		setSex(sex);
		setLevel(lvl);
		setTelefono(tel);
		/*if (this.ID > Account.lastAccIdDb)
			Account.lastAccIdDb = this.ID;*/
	}

	// costruttore del contatto
	public Account(int acc_id, String photo, String f_name, String s_name,
			int sex) {
		setFirstname(f_name);
		setID(acc_id);
		setPhoto(photo);
		setSecondname(s_name);
		setSex(sex);
	}

	public Vector<Account> getContactOfAccount(int acc_id) {
		Vector<Account> cnt = new Vector<Account>();
		return cnt;
	}

	public int getID() {
		return this.ID;
	}

	public void setID(int iD) {
		this.ID = iD;
	}

	public String getPhoto() {
		return this.photo;
	}

	public void setPhoto(String photo) {
		this.photo = photo;
	}

	public String getFirstname() {
		return this.firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}

	public String getSecondname() {
		return this.secondname;
	}

	public void setSecondname(String secondname) {
		this.secondname = secondname;
	}

	public int getSex() {
		return this.sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	public Vector<Email> getEmail() {
		return this.email;
	}

	public void setEmail(Vector<Email> email) {
		this.email = email;
	}

	public void setOldEmail(Vector<Email> oldEmail) {
		this.oldEmail = oldEmail;
	}

	public void setOldIndirizzo(Vector<Indirizzo> oldIndirizzo) {
		this.oldIndirizzo = oldIndirizzo;
	}

	public void setOldTelefono(Vector<Telefono> oldTelefono) {
		this.oldTelefono = oldTelefono;
	}

	public void addEmail() {
		Email eml = new Email();
		if (this.email.isEmpty())
			eml.setEml_id(eml.get_LastEmlIDfromDB());
		else {
			eml.set_LastEmlIDfromDB();
			eml.setEml_id(Email.lastEmlIdDb); // get(email.size()-1).getEml_id()+1);
		}
		this.email.add(eml);
	}

	/*
	 * public void addEmail(int eml_id, String email){ for (int
	 * i=0;i<this.email.size();i++) if (this.email.get(i).getEml_id() ==
	 * eml_id){ this.email.get(i).setEmail(email); break; } }
	 */

	public void delEmail(int id) {
		for (int i = 0; i < this.email.size(); i++)
			if (this.email.get(i).getEml_id() == id) {
				this.email.remove(i);
				break;
			}
	}

	public Vector<Indirizzo> getIndirizzo() {
		return this.indirizzo;
	}

	public void setIndirizzo(Vector<Indirizzo> indirizzo) {
		this.indirizzo = indirizzo;
	}

	public void addIndirizzo() {
		Indirizzo adr = new Indirizzo();
		if (this.indirizzo.isEmpty())
			adr.setAdr_id(adr.get_LastAdrIDfromDB());
		else {
			adr.set_LastAdrIDfromDB();
			adr.setAdr_id(Indirizzo.lastAdrIdDb);
		}
		this.indirizzo.add(adr);
	}

	public void delIndirizzo(int id) {
		for (int i = 0; i < this.indirizzo.size(); i++)
			if (this.indirizzo.get(i).getAdr_id() == id) {
				this.indirizzo.remove(i);
				break;
			}
	}

	public Vector<Telefono> getTelefono() {
		return this.telefono;
	}

	public void setTelefono(Vector<Telefono> telefono) {
		this.telefono = telefono;
	}

	public void addTelefono() {
		Telefono tel = new Telefono();
		if (this.telefono.isEmpty())
			tel.setTel_id(tel.get_LastTelIDfromDB());
		else {
			tel.set_LastTelIDfromDB();
			tel.setTel_id(Telefono.lastTelIdDb);
		}
		this.telefono.add(tel);
	}

	/*
	 * public void addTelefono(int tel_id, String num){ for (int
	 * i=0;i<this.telefono.size();i++) if (this.telefono.get(i).getTel_id() ==
	 * tel_id){ this.telefono.get(i).setNum(num); break; } }
	 */
	public void delTelefono(int id) {
		for (int i = 0; i < this.telefono.size(); i++)
			if (this.telefono.get(i).getTel_id() == id) {
				this.telefono.remove(i);
				break;
			}
	}

	public Vector<Account> getRubrica() {
		return this.rubrica;
	}

	public void setRubrica(Vector<Account> rubrica) {
		this.rubrica = rubrica;
	}

	public void delRubrica(int id) {
		this.rubrica.remove(id);
	}

	public void UpdateAccountOnDb() {
		setOldIndirizzo(Indirizzo.accAdr(this.ID));
		setOldEmail(Email.accEml(this.ID));
		setOldTelefono(Telefono.accTel(this.ID));
		String Query = "UPDATE account SET password = '" + this.password
				+ "',f_name = '" + this.firstname + "',s_name = '"
				+ this.secondname + "',sex = " + this.sex + ",photo = '"
				+ this.photo + "',level = " + this.level + " WHERE acc_id = "
				+ this.ID;
		Database.updateResource(Query);
		// inserisco gli indirizzi
		// int giro = 0;
		int a = 0, b = 0;
		boolean flagger = true;
		for (a = 0; a < this.oldIndirizzo.size(); a++) {
			for (b = 0; b < this.indirizzo.size(); b++)
				if (this.oldIndirizzo.get(a).getAdr_id() == this.indirizzo.get(
						b).getAdr_id()) { // se esiste corrispondenza faccio
					// l'update
					Query = "UPDATE indirizzo SET indirizzo = '"
							+ this.indirizzo.get(b).getIndirizzo()
							+ "',citta = '" + this.indirizzo.get(b).getCitta()
							+ "',provincia = '"
							+ this.indirizzo.get(b).getProvincia() + "',cap = "
							+ this.indirizzo.get(b).getCap()
							+ " WHERE adr_id = "
							+ this.indirizzo.get(b).getAdr_id();
					Database.updateResource(Query);
					flagger = false;
					break;
				} else
					flagger = true;
			if (flagger)
				Database.deleteResource("DELETE FROM indirizzo WHERE adr_id = "
						+ this.oldIndirizzo.get(a).getAdr_id());
		}
		for (b = 0; b < this.indirizzo.size(); b++) {
			flagger = true;
			for (a = 0; a < this.oldIndirizzo.size(); a++)
				if (this.indirizzo.get(b).getAdr_id() == this.oldIndirizzo.get(
						a).getAdr_id())
					flagger = false;
			if (flagger) { // aggiungo le informazioni che non erno presenti
				// nell'old
				int id = this.indirizzo.get(b).get_LastAdrIDfromDB();
				Query = "INSERT INTO indirizzo (adr_id,indirizzo,citta,provincia,cap,acc_id) "
						+ "VALUES ("
						+ id
						+ ",'"
						+ this.indirizzo.get(b).getIndirizzo()
						+ "','"
						+ this.indirizzo.get(b).getCitta()
						+ "','"
						+ this.indirizzo.get(b).getProvincia()
						+ "',"
						+ this.indirizzo.get(b).getCap() + "," + this.ID + ")";
				Database.setResource(Query);
			}
		}
		// inserisco i nemeri telefonici
		for (a = 0; a < this.oldTelefono.size(); a++) {
			for (b = 0; b < this.telefono.size(); b++)
				if (this.oldTelefono.get(a).getTel_id() == this.telefono.get(b)
				.getTel_id()) { // se esiste corrispondenza faccio
					// l'update
					Query = "UPDATE telefono SET num = '"
							+ this.telefono.get(b).getNum()
							+ "' WHERE tel_id = "
							+ this.telefono.get(b).getTel_id();
					Database.updateResource(Query);
					flagger = false;
					break;
				} else
					flagger = true;
			if (flagger) { // se non è stata trovata corrispondenza elimino dal
				// db l'informazione
				Query = "DELETE FROM telefono WHERE tel_id = "
						+ this.oldTelefono.get(a).getTel_id();
				Database.deleteResource(Query);
			}
		}
		for (b = 0; b < this.telefono.size(); b++) {
			flagger = true;
			for (a = 0; a < this.oldTelefono.size(); a++)
				if (this.telefono.get(b).getTel_id() == this.oldTelefono.get(a)
				.getTel_id())
					flagger = false;
			if (flagger) { // aggiungo le informazioni che non erno presenti
				// nell'old
				int id = this.telefono.get(b).get_LastTelIDfromDB();
				Query = "INSERT INTO telefono (tel_id,num,acc_id) "
						+ "VALUES (" + id + ",'"
						+ this.telefono.get(b).getNum() + "'," + this.ID + ")";
				Database.setResource(Query);
			}
		}
		// inserisco le email
		for (a = 0; a < this.oldEmail.size(); a++) {
			for (b = 0; b < this.email.size(); b++)
				if (this.oldEmail.get(a).getEml_id() == this.email.get(b)
				.getEml_id()) { // se esiste corrispondenza faccio
					// l'update
					Query = "UPDATE email SET eml = '"
							+ this.email.get(b).getEmail()
							+ "' WHERE eml_id = "
							+ this.email.get(b).getEml_id();
					Database.updateResource(Query);
					flagger = false;
					break;
				} else
					flagger = true;
			if (flagger) { // se non è stata trovata corrispondenza elimino dal
				// db l'informazione
				Query = "DELETE FROM email WHERE eml_id = "
						+ this.oldEmail.get(a).getEml_id();
				Database.deleteResource(Query);
			}
		}
		for (b = 0; b < this.email.size(); b++) {
			flagger = true;
			for (a = 0; a < this.oldEmail.size(); a++)
				if (this.email.get(b).getEml_id() == this.oldEmail.get(a)
				.getEml_id())
					flagger = false;
			if (flagger) { // aggiungo le informazioni che non erno presenti
				// nell'old
				int id = this.email.get(b).get_LastEmlIDfromDB();
				Query = "INSERT INTO email (eml_id,eml,acc_id) " + "VALUES ("
						+ id + ",'"
						+ this.email.get(b).getEmail() + "'," + this.ID + ")";
				Database.setResource(Query);
			}
		}
	}

	public void insertAccountOnDb() {
		this.ID=getLastAcc_IdOnDb();
		String Query = "INSERT INTO account (acc_id,username,password,f_name,s_name,sex,photo,level) "
				+ "VALUES ("+this.ID+",'"
				+ this.username
				+ "','"
				+ this.password
				+ "','"
				+ this.firstname
				+ "','"
				+ this.secondname
				+ "','"
				+ this.sex
				+ "','" + this.photo + "'," + this.level + ")";
		Database.setResource(Query);
		// inserisco gli indirizzi
		for (int i = 0; i < this.indirizzo.size(); i++) {
			int id = this.indirizzo.get(i).get_LastAdrIDfromDB();
			Query = "INSERT INTO indirizzo (adr_id,indirizzo,citta,provincia,cap,acc_id) "
					+ "VALUES ("+ id+ ",'"+ this.indirizzo.get(i).getIndirizzo()
					+ "','"	+ this.indirizzo.get(i).getCitta()
					+ "','"	+ this.indirizzo.get(i).getProvincia()
					+ "',"	+ this.indirizzo.get(i).getCap()
					+ "," + this.ID
					+ ")";
			Database.setResource(Query);
		}

		// inserisco i nemeri telefonici
		for (int i = 0; i < this.telefono.size(); i++) {
			int id = this.telefono.get(i).get_LastTelIDfromDB();
			Query = "INSERT INTO telefono (tel_id,num,acc_id) "
					+ "VALUES ("+ id
					+ ",'" + this.telefono.get(i).getNum()
					+ "'," + this.ID
					+ ")";
			Database.setResource(Query);
		}
		// inserisco le email
		for (int i = 0; i < this.email.size(); i++) {
			int id = this.email.get(i).get_LastEmlIDfromDB();
			Query = "INSERT INTO email (eml_id,eml,acc_id) "
					+ "VALUES ("+ id
					+ ",'"+ this.email.get(i).getEmail()
					+ "'," + this.ID
					+ ")";
			Database.setResource(Query);
		}
	}

	public String getUsername() {
		return this.username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public int getLevel() {
		return this.level;
	}

	public String getPassword() {
		return this.password;
	}

	public void addContact(int id) {
		Database.setResource("INSERT INTO rubrica (acc_id,cnt_id) VALUES ("
				+ this.ID + "," + id + ")");
		this.rubrica = Database.accRub(this.ID);
	}

	public void removeContact(int id) {
		Database.deleteResource("DELETE FROM rubrica WHERE acc_id=" + this.ID
				+ " AND cnt_id=" + id);
		this.rubrica = Database.accRub(this.ID);
	}

	public void uppdater() {
		setChanged();
		notifyObservers();
	}

	public String[] getEvnComuni() {
		return evnComuni;
	}

	public String[] getEvnSettore() {
		return evnSector;
	}

	public String getSector() {
		String sect = "";
		switch (this.level) {
		case 0: {
			sect = "Ricerca e Sviluppo";
			String[] evn = {
					// 0)Eventi Ricerca e Sviluppo
					"Anteprima", "Modellazione", "Presentazione",
					"Progettazione", "Testing"

			};
			evnSector = evn;
		}
		break;
		case 1: {
			sect = "Produzione e Qualità";
			String[] evn = {
					// 1)Eventi Produzione e Qualità
					"Controllo rendimento", "Inventario", "Ispezione qualità" };
			evnSector = evn;
		}
		break;
		case 2: {
			sect = "Logistica";
			String[] evn = {
					// 2)Eventi Logistica
					"Acquisto materiali", "Distribuzione prodotto",
			"Programmazione produzione" };
			evnSector = evn;
		}
		break;
		case 3: {
			sect = "Marketing";
			String[] evn = {
					// 3)Eventi Marketing
					"Posizionamento prodotto", "Promozione", };
			evnSector = evn;
		}
		break;
		case 4: {
			sect = "Vendite";
			String[] evn = {
					// 4)Eventi Vendite
					"Fiera", "Presentazione", "Promozione", "Viaggio di lavoro" };
			evnSector = evn;
		}
		break;
		case 5: {
			sect = "Amministrazione e Finanza";
			String[] evn = {
					// 5)Eventi Amministrazione e Finanza
					"Auditing", "Budgeting", "Consulenza",
					"Presentazione bilancio", "Resoconto parziale" };
			evnSector = evn;
		}
		break;
		case 6: {
			sect = "Personale e Organizzazione";
			String[] evn = {
					// 6)Eventi Personale e Organizzazione
					"Carrier day", "Formazione", "Selezione" };
			evnSector = evn;
		}
		break;
		case 7: {
			sect = "Sistemi Informativi";
			String[] evn = {
					// 7)Eventi Sistemi Informativi
					"Consulenza", "Controllo" };
			evnSector = evn;
		}
		break;
		case 8: {
			sect = "Relazioni Esterne";
			String[] evn = {
					// 8)Eventi Relazioni Esterne
					"Beneficenza", "Cerimonia", "Concerto", "Conferenza",
					"Congresso", "Festa", "Giornalismo", "Media travel",
					"Premiazione", "Sponsor", "Workshop"

			};
			evnSector = evn;
		}
		break;
		case 512: {
			sect = "Admin";
			String[] evn = {
					// 512)Eventi Admin
					"Acquisto materiali", "Anteprima", "Auditing",
					"Beneficenza", "Budgeting", "Carrier day", "Cerimonia",
					"Concerto", "Conferenza", "Congresso", "Consulenza",
					"Controllo", "Controllo rendimento",
					"Distribuzione prodotto", "Festa", "Fiera", "Formazione",
					"Giornalismo", "Inventario", "Ispezione qualità",
					"Media travel", "Modellazione", "Posizionamento prodotto",
					"Premiazione", "Presentazione", "Progettazione",
					"Programmazione produzione", "Promozione",
					"Resoconto parziale", "Selezione", "Sponsor", "Testing",
					"Viaggio di lavoro", "Workshop" };
			evnSector = evn;
		}
		}
		return sect;
	}

	public void removeAccount() {
		Database.deleteResource("DELETE FROM account WHERE acc_id=" + getID());
		Database.deleteResource("DELETE FROM email WHERE acc_id=" + getID());
		Database.deleteResource("DELETE FROM evento WHERE acc_id=" + getID());
		Database.deleteResource("DELETE FROM indirizzo WHERE acc_id=" + getID());
		Database.deleteResource("DELETE FROM telefono WHERE acc_id=" + getID());
		Database.deleteResource("DELETE FROM invitati WHERE inv_id=" + getID());
		Database.deleteResource("DELETE FROM notifica WHERE acc_id=" + getID());
		Database.deleteResource("DELETE FROM rubrica WHERE acc_id=" + getID());
		Database.deleteResource("DELETE FROM rubrica WHERE cnt_id=" + getID());
		Engine.removeImage();
		new Notifica(4, "" + this.ID, "");
	}
}
